<?php

namespace wechat;

class Wx{

//    这里我们使用属性来进行赋值
    public $message;
    public function __construct()
    {
//        自动获取数据流，不用手动获取
        $this->message = $this->parentAction();
//        那么构造方法在哪调用的呢，在handel方法里调用,属性赋值
    }

    public function volid(){
        if (isset($_GET['signature']) && isset($_GET['timestamp']) && isset($_GET['nonce']) && isset($_GET['echostr'])){
            $signature = $_GET['signature'];
            $timestamp = $_GET['timestamp'];
            $nonce = $_GET['nonce'];
            $echostr = $_GET['echostr'];
            $token = 'hahaha';


    //根据文档已经获得了所有的参数，下一步进行字典排序
            $arr = [$timestamp,$nonce,$token];
    //file_put_contents('data.php',$arr);
            sort($arr,SORT_STRING);
    //将三个数拆分成字符串进行sha1加密
            $str = implode($arr);
            $strimg = sha1($str);

    //file_put_contents('data.php',$strimg);
    //file_put_contents('abc.php',$signature);
    //最后将加密过后的字符串与$signature进行比较
            if ($strimg == $signature){

                echo $echostr;

            }
        }

    }
//    验证成功，下一步:接收用户发来的消息
    public function parentAction(){
//        1.从服务器上获取用户数据流的数据
        $xml = file_get_contents('php://input');
//        2.将获得的xml数据转换成simpleXmlElement对象，并且- 将 CDATA 设置为文本节点
        if ($xml){
            $message = simplexml_load_string($xml,'simpleXMLElement',LIBXML_NOCDATA);
            return $message;
//            在哪调用呢，我们去构造方法里调用，因为首先看用户有没有给我们发消息
        }
    }

//    获取用户发来的数据的方法
    public function getmessage(){
        return $this->message;
    }




//+++++++++++++++++++++++++++++++++++以下代码为直接复制老师的++++++++++++++++++++++++++++++++++++//


//    下一步：自定义菜单,首先获取access_token的值
    /**
     *
     * curl发送请求方法
     *
     * @param $url  请求地址
     * @param array $field 提交的数据
     * @return string
     */
    public function curl($url, $field = [])
    {
        //初始化curl
        $ch = curl_init();
        //设置curl参数
        //设置请求地址
        curl_setopt($ch, CURLOPT_URL, $url);
        //设置接收返回结果,但不直接展示在界面
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //设置禁止证书校验
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        //判断是否为post请求
        if (!empty($field)) {
            //定义超时时间
            curl_setopt($ch, CURLOPT_TIMEOUT, 30);
            //开启post请求
            curl_setopt($ch, CURLOPT_POST, 1);
            //传递post数据
            curl_setopt($ch, CURLOPT_POSTFIELDS, $field);
        }

        //发送请求,定义一个变量接收请求结果
        $data = '';
        //发送请求可能失败,所以我需要判断,如果请求成功,将请求结果赋值给$data,反之,不给$data赋值
        if (curl_exec($ch)) {
            $data = curl_multi_getcontent($ch);
        }
        //关闭curl
        curl_close($ch);
        //返回接收到的数据
        return $data;
    }


//+++++++++++++++++++++++++++++++++以上代码为直接复制老师的++++++++++++++++++++++++++++++++++++++++//


//        获取access_token,并且保存到文件
        public function getAccessToken(){
//            1.创建文件保存access_token
            $dir = __DIR__.'/cache';
            is_dir($dir) || mkdir($dir);
//            2.定义文件的名称（唯一)
            $filename = $dir.'/token'.md5('wx60bf3a5880497091').'.php';
//3.每次调用这个方法的时候,就应该判断是否存在存放access_token数据的文件,并且判断这个文件是否过期,如果存在,没有过期的文件,直接从文件里面取值,如果不满足前面的条件,就重新获取,然后保存
            if (is_file($filename) && filemtime($filename)+7100>time()){

                $data = include $filename;
            }else{

//                设置请求的地址
                $dizhi = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx60bf3a5880497091&secret=930348ee3b4ab56382ca0dac666631a1';
//                根据文档使用get请求(curl)获取access_token

                $data = $this->curl($dizhi);

//                判断请求里面有没有错误，如果有错误就返回假，程序不往下执行
                $data = json_decode($data,true);
                if (isset($data['errcode'])){
                    return false;
                }
//                若得到正常的数据，就把它写到文件中
                file_put_contents($filename,"<?php return " . var_export($data,true).";\n?>");
            }
            return $data['access_token'];
        }


//        使用js_sdk发消息,但是首先得获取jsapi_ticket
        public function getJsapi_ticket(){
//        1.一样的道理，创建缓存文件保存jsapi_ticket
            $dir = __DIR__.'/cache';
            is_dir($dir)||mkdir($dir);
//            2.定义文件名称
            $filename = $dir.'/ticket'.md5('wx60bf3a5880497091').'.php';
//3.每次调用这个方法的时候,就应该判断是否存在存放access_token数据的文件,并且判断这个文件是否过期,如果存在,没有过期的文件,直接从文件里面取值,如果不满足前面的条件,就重新获取,然后保存
            if (is_file($filename) && filemtime($filename)+7100>time()){

                $data = include $filename;
            }else{

//                设置请求的地址
//                $dizhi = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx60bf3a5880497091&secret=930348ee3b4ab56382ca0dac666631a1';
//                根据文档，拿access_token获取jsapi_ticket
                $dizhi = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$this->getAccessToken().'&type=jsapi';

                $data = $this->curl($dizhi);

//                判断请求里面有没有错误，如果有错误就返回假，程序不往下执行
                $data = json_decode($data,true);
                if ($data['errcode']!=0){
                    return false;
                }else{
 //                若得到正常的数据，就把它写到文件中
                    file_put_contents($filename,"<?php return " . var_export($data,true).";\n?>");
                }
            }
            return $data['ticket'];
        }
}
